package com.lyb.hardware;

import com.lyb.Utils;
import com.lyb.constant.StatusConstant;
import com.lyb.hardware.cpu.AlpacaRegister;

/**
 * 进程控制块(Process Control Block)
 * 系统中存放进程的管理和控制信息的数据结构，用于描述控制进程的运行
 *
 * @author Dayun Mr.Alpaca
 * @version 1.4.0
 */
public class AlpacaPCB {
    /**
     * 进程标识符(唯一)
     */
    private final Long id;
    /**
     * 该进程在CPU中的寄存器组现场
     */
    private AlpacaRegister register;
    /**
     * 进程描述
     * 主要用于描述本进程阻塞原因
     */
    private String description;
    /**
     * 该PCB对应可执行文件在内存中的起始索引
     */
    private int startIndex;
    /**
     * 该PCB对应可执行文件在内存中的结束索引
     */
    private int endIndex;
    /**
     * 已被CPU执行的行数
     */
    private int row;
    /**
     * 对应可执行文件路径
     */
    private String path;


    public AlpacaPCB() {
        /* 给进程随机分配一个进程标识符 */
        id = Utils.getUniqueId();
        /* 属性初始化 */
        init();
    }

    /**
     * 初始化PCB
     */
    public void init() {
        /* 初始化寄存器组 */
        register = new AlpacaRegister();
        /* 无堵塞原因 */
        description = StatusConstant.EMPTY;
        /* 清空索引 */
        startIndex = endIndex = 0;
        /* CPU执行行数为0 */
        row = 0;
        /* 对应可执行文件路径为null */
        path = null;
    }


    /* ********** 处理现场 ********** */

    /**
     * 保存现场，将传入寄存器组保存到当前PCB对象中
     *
     * @param register 寄存器组
     */
    public void save(AlpacaRegister register) {
        this.register = register;
    }

    /**
     * 恢复现场，获取当前PCB寄存器组值返回
     *
     * @return 当前PCB寄存器组值
     */
    public AlpacaRegister load() {
        return register;
    }


    /* ********** Getter & Setter ********** */

    public Long getId() {
        return id;
    }

    public int getStartIndex() {
        return startIndex;
    }

    public void setStartIndex(int startIndex) {
        this.startIndex = startIndex;
    }

    public int getEndIndex() {
        return endIndex;
    }

    public void setEndIndex(int endIndex) {
        this.endIndex = endIndex;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public int getRow() {
        return row;
    }

    public void setRow(int row) {
        this.row = row;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    @Override
    public String toString() {
        return id+"                  "+description+
                "                               "+register+"                         "+
                path;
    }
}
